package com.lekang.system.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.lekang.system.service.IBillService;

import java.time.LocalDateTime;

/**
 * 账单生成定时任务
 * 
 * @author lekang
 * @date 2025-10-24
 */
@Component
public class BillGenerationTask
{
    private static final Logger log = LoggerFactory.getLogger(BillGenerationTask.class);

    @Autowired
    private IBillService billService;

    /**
     * 定时任务：每月1号00:00执行
     * 自动生成下月账单（仅生成已入住老人）
     * cron表达式：0 0 0 1 * ?
     * - 秒：0
     * - 分：0
     * - 时：0
     * - 日：1（每月1号）
     * - 月：*（每月）
     * - 周：?（不指定）
     */
    // 或者：每10秒执行一次（测试）
//    @Scheduled(cron = "*/10 * * * * ?")
    @Scheduled(cron = "0 0 0 1 * ?")
    public void generateMonthlyBills()
    {
        try
        {
            log.info("开始执行账单自动生成定时任务，当前时间：{}", LocalDateTime.now());
            
            int generateCount = billService.generateBillsAuto();
            
            if (generateCount > 0)
            {
                log.info("账单自动生成完成，共生成 {} 条账单记录", generateCount);
            }
            else
            {
                log.info("账单自动生成完成，没有需要生成的账单记录");
            }
        }
        catch (Exception e)
        {
            log.error("账单自动生成定时任务执行失败", e);
        }
    }

    /**
     * 定时任务：每月6号00:00执行
     * 标记欠费账单（支付截止日期已过且未支付的账单）
     * cron表达式：0 0 0 6 * ?
     */
    @Scheduled(cron = "0 0 0 6 * ?")
    public void markOverdueBills()
    {
        try
        {
            log.info("开始执行欠费账单标记定时任务，当前时间：{}", LocalDateTime.now());
            
            int markCount = billService.markOverdueBills();
            
            if (markCount > 0)
            {
                log.info("欠费账单标记完成，共标记 {} 条欠费账单", markCount);
            }
            else
            {
                log.info("欠费账单标记完成，没有需要标记的账单");
            }
        }
        catch (Exception e)
        {
            log.error("欠费账单标记定时任务执行失败", e);
        }
    }

    /**
     * 手动触发生成账单（用于测试）
     */
    public void manualGenerateBills()
    {
        log.info("手动触发账单生成");
        generateMonthlyBills();
    }

    /**
     * 手动触发标记欠费（用于测试）
     */
    public void manualMarkOverdue()
    {
        log.info("手动触发欠费标记");
        markOverdueBills();
    }
}


